package com.penghaonan.appframework.utils.monitor;

import android.content.ContentResolver;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;

import com.penghaonan.appframework.AppDelegate;

import java.util.HashMap;
import java.util.Map;

public class BrightnessMonitor extends AMonitor<Integer> {

    private final ContentObserver observer = new ContentObserver(new Handler(Looper.getMainLooper())) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            notifyListeners();
        }
    };

    public BrightnessMonitor() {
        AppDelegate.getApp().getContentResolver().registerContentObserver(
                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),
                true, observer);
    }

    @Override
    public Integer getValue() {
        int nowBrightnessValue = 0;
        ContentResolver resolver = AppDelegate.getApp().getContentResolver();
        try {
            nowBrightnessValue = Settings.System.getInt(
                    resolver, Settings.System.SCREEN_BRIGHTNESS);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return convertGammaToLinear(nowBrightnessValue);
    }

    private static int convertGammaToLinear(int val) {
        return map.get(val);
    }

    public Integer getMaxValue() {
        return 100;
    }

    @Override
    public void release() {
        super.release();
        AppDelegate.getApp().getContentResolver().unregisterContentObserver(observer);
    }

    private static final Map<Integer, Integer> map = new HashMap<>();

    static {
        map.put(0, 0);
        map.put(1, 6);
        map.put(2, 11);
        map.put(3, 15);
        map.put(4, 19);
        map.put(5, 22);
        map.put(6, 24);
        map.put(7, 27);
        map.put(8, 29);
        map.put(9, 31);
        map.put(10, 33);
        map.put(11, 34);
        map.put(12, 36);
        map.put(13, 38);
        map.put(14, 39);
        map.put(15, 41);
        map.put(16, 42);
        map.put(17, 43);
        map.put(18, 45);
        map.put(19, 46);
        map.put(20, 47);
        map.put(21, 49);
        map.put(22, 50);
        map.put(23, 51);
        map.put(24, 52);
        map.put(25, 53);
        map.put(26, 54);
        map.put(27, 55);
        map.put(28, 56);
        map.put(29, 57);
        map.put(30, 57);
        map.put(31, 57);
        map.put(32, 57);
        map.put(33, 60);
        map.put(34, 60);
        map.put(35, 61);
        map.put(36, 62);
        map.put(37, 62);
        map.put(38, 63);
        map.put(39, 63);
        map.put(40, 64);
        map.put(41, 64);
        map.put(42, 65);
        map.put(43, 65);
        map.put(44, 66);
        map.put(45, 66);
        map.put(46, 67);
        map.put(47, 67);
        map.put(48, 68);
        map.put(49, 68);
        map.put(50, 69);
        map.put(51, 69);
        map.put(52, 70);
        map.put(53, 70);
        map.put(54, 70);
        map.put(55, 71);
        map.put(56, 71);
        map.put(57, 71);
        map.put(58, 72);
        map.put(59, 72);
        map.put(60, 72);
        map.put(61, 73);
        map.put(62, 73);
        map.put(63, 73);
        map.put(64, 74);
        map.put(65, 74);
        map.put(66, 74);
        map.put(67, 75);
        map.put(68, 75);
        map.put(69, 75);
        map.put(70, 75);
        map.put(71, 76);
        map.put(72, 76);
        map.put(73, 76);
        map.put(74, 76);
        map.put(75, 76);
        map.put(76, 77);
        map.put(77, 77);
        map.put(78, 77);
        map.put(79, 78);
        map.put(80, 78);
        map.put(81, 78);
        map.put(82, 78);
        map.put(83, 78);
        map.put(84, 79);
        map.put(85, 79);
        map.put(86, 80);
        map.put(87, 80);
        map.put(88, 80);
        map.put(89, 80);
        map.put(90, 80);
        map.put(91, 81);
        map.put(92, 81);
        map.put(93, 81);
        map.put(94, 81);
        map.put(95, 81);
        map.put(96, 82);
        map.put(97, 82);
        map.put(98, 82);
        map.put(99, 82);
        map.put(100, 82);
        map.put(101, 82);
        map.put(102, 83);
        map.put(103, 83);
        map.put(104, 83);
        map.put(105, 83);
        map.put(106, 83);
        map.put(107, 84);
        map.put(108, 84);
        map.put(109, 84);
        map.put(110, 84);
        map.put(111, 84);
        map.put(112, 85);
        map.put(113, 85);
        map.put(114, 85);
        map.put(115, 85);
        map.put(116, 85);
        map.put(117, 85);
        map.put(118, 85);
        map.put(119, 86);
        map.put(120, 86);
        map.put(121, 86);
        map.put(122, 87);
        map.put(123, 87);
        map.put(124, 87);
        map.put(125, 87);
        map.put(126, 87);
        map.put(127, 87);
        map.put(128, 87);
        map.put(129, 87);
        map.put(130, 88);
        map.put(131, 88);
        map.put(132, 88);
        map.put(133, 88);
        map.put(134, 88);
        map.put(135, 88);
        map.put(136, 88);
        map.put(137, 88);
        map.put(138, 89);
        map.put(139, 89);
        map.put(140, 89);
        map.put(141, 89);
        map.put(142, 89);
        map.put(143, 89);
        map.put(144, 89);
        map.put(145, 90);
        map.put(146, 90);
        map.put(147, 90);
        map.put(148, 90);
        map.put(149, 90);
        map.put(150, 90);
        map.put(151, 90);
        map.put(152, 91);
        map.put(153, 91);
        map.put(154, 91);
        map.put(155, 91);
        map.put(156, 91);
        map.put(157, 91);
        map.put(158, 91);
        map.put(159, 91);
        map.put(160, 91);
        map.put(161, 91);
        map.put(162, 92);
        map.put(163, 92);
        map.put(164, 92);
        map.put(165, 92);
        map.put(166, 92);
        map.put(167, 92);
        map.put(168, 92);
        map.put(169, 92);
        map.put(170, 92);
        map.put(171, 93);
        map.put(172, 93);
        map.put(173, 93);
        map.put(174, 93);
        map.put(175, 93);
        map.put(176, 93);
        map.put(177, 93);
        map.put(178, 93);
        map.put(179, 93);
        map.put(180, 94);
        map.put(181, 94);
        map.put(182, 94);
        map.put(183, 94);
        map.put(184, 94);
        map.put(185, 94);
        map.put(186, 94);
        map.put(187, 94);
        map.put(188, 94);
        map.put(189, 94);
        map.put(190, 95);
        map.put(191, 95);
        map.put(192, 95);
        map.put(193, 95);
        map.put(194, 95);
        map.put(195, 95);
        map.put(196, 95);
        map.put(197, 95);
        map.put(198, 95);
        map.put(199, 95);
        map.put(200, 96);
        map.put(201, 96);
        map.put(202, 96);
        map.put(203, 96);
        map.put(204, 96);
        map.put(205, 96);
        map.put(206, 96);
        map.put(207, 96);
        map.put(208, 96);
        map.put(209, 96);
        map.put(210, 96);
        map.put(211, 96);
        map.put(212, 97);
        map.put(213, 97);
        map.put(214, 97);
        map.put(215, 97);
        map.put(216, 97);
        map.put(217, 97);
        map.put(218, 97);
        map.put(219, 97);
        map.put(220, 97);
        map.put(221, 97);
        map.put(222, 97);
        map.put(223, 98);
        map.put(224, 98);
        map.put(225, 98);
        map.put(226, 98);
        map.put(227, 98);
        map.put(228, 98);
        map.put(229, 98);
        map.put(230, 98);
        map.put(231, 98);
        map.put(232, 98);
        map.put(233, 98);
        map.put(234, 98);
        map.put(235, 99);
        map.put(236, 99);
        map.put(237, 99);
        map.put(238, 99);
        map.put(239, 99);
        map.put(240, 99);
        map.put(241, 99);
        map.put(242, 99);
        map.put(243, 99);
        map.put(244, 99);
        map.put(245, 99);
        map.put(246, 99);
        map.put(247, 99);
        map.put(248, 100);
        map.put(249, 100);
        map.put(250, 100);
        map.put(251, 100);
        map.put(252, 100);
        map.put(253, 100);
        map.put(254, 100);
        map.put(255, 100);
    }
}
